package com.goa.parse;

/**
 * 解析Modbus协议工具类
 *
 *
 * 16进制案例格式
 * 01 04 0c 001c0016002508f904ae046a 13e7
 */
public class ParseModbusUtils {


    /**
     * 将字节数组转换为16进制字符串
     *
     * @param bytes 字节数组
     * @return 16进制字符串
     */
    public static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();

        for (byte b : bytes) {
            // 将字节转换为16进制，并确保每个值都是两位数
            String hex = String.format("%02x", b & 0xFF);
            System.out.println("hex = " + hex);
            hexString.append(hex);
        }

        return hexString.toString().toUpperCase(); // 转换为大写
    }



    /**
     * 解析地址位
     * @param message Modbus消息
     * @return 地址位
     */
    public static String parseAddress(byte[] message) {
        // 假设地址位在消息的第一个字节
        byte addressByte = message[0];
        return String.format("%02X", addressByte & 0xFF);
    }

    /**
     * 解析功能码
     * @param message Modbus消息
     * @return 功能码
     */
    public static int parseFunctionCode(byte[] message) {
        // 假设功能码在消息的第二个字节
        return message[1] & 0xFF; // 转换为无符号整数
    }

    /**
     * 解析字节数
     * @param message Modbus消息
     * @return 字节数
     */
    public static int parseByteCount(byte[] message) {
        // 假设字节数在消息的第三个字节
        return message[2] & 0xFF; // 转换为无符号整数
    }

    /**
     * 解析数据
     * @param message Modbus消息
     * @return 数据
     */
    public static byte[] parseData(byte[] message) {
        // 假设数据从第四个字节开始，长度由字节数决定
        int byteCount = parseByteCount(message);
        byte[] data = new byte[byteCount];
        System.arraycopy(message, 3, data, 0, byteCount); // 复制数据
        return data;
    }
}
